﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace IRepository
{
    public interface IBaseRespository<T> where T : class
    {
        MyContext MyContexts { set; get; }
        //封装通用方法：增删改查  什么是接口：就是规范
        /// <summary>
        /// 增加一行（数据库中一行记录相当于一个实体）
        /// </summary>
        /// <param name="t">泛型实体  传会员实体或者房型、房号。。。</param>
        /// <returns>受影响的行数</returns>  //Task---任务
        Task<int> AddAsync(T t);
        /// <summary>
        /// 增加多行（数据库中多条记录相当于一个list）
        /// </summary>
        /// <param name="list">list</param>
        /// <returns>受影响的行数</returns>
        Task<int> AddRangAsync(List<T> list);

        /// <summary>
        /// 修改一条记录
        /// </summary>
        /// <param name="t">修改的实体</param>
        /// <returns>受影响的行数</returns>
        Task<int> UpdateAsync(T t);


        /// <summary>
        /// 修改多条记录
        /// </summary>
        /// <param name="t">修改的实体list</param>
        /// <returns>受影响的行数</returns>
        Task<int> UpdateRangeAsync(List<T> list);


        /// <summary>
        /// 查询 -- 延迟查询
        /// </summary>
        /// <returns>返回list</returns>
        IQueryable<T> GetList();

        /// <summary>
        /// 指定条件查询
        /// </summary>
        /// <param name="exp">委托表达式(调用时需传递lamdba表达式)</param>
        /// <returns>返回满足条件的数据</returns>
        IQueryable<T> GetList(Expression<Func<T, bool>> exp);

        /// <summary>
        /// 根据id获取数据
        /// </summary>
        /// <param name="id">实体id</param>
        /// <returns>实体</returns>
        Task<T> GetItemById(int id);


        /// <summary>
        /// 根据条件获取实体
        /// </summary>
        /// <param name="exp">委托表达式(调用时需传递lamdba表达式)</param>
        /// <returns>返回满足条件的实体</returns>
        Task<T> GetItemById(Expression<Func<T, bool>> exp);
    }
}
